#!/usr/bin/python3
import sys
import xml.etree.ElementTree as ET

from copy import copy

def dictify(file,root=True):
    ret = {}
    if root:
        r = ET.parse(file).getroot()
    else:
        r = file
    for child in r:
        arr = []
        for it in r.iter(child.tag):
            if it.text.strip() == "":
                arr.append(dictify(it,False))
            else:
                if it.attrib:
                    arr2 = {}
                    arr2[child.tag] = it.text.strip()
                    for i in it.attrib:
                        arr2[i] = it.get(i)
                    arr.append(arr2)
                else:
                    arr.append(it.text.strip())
        if len(arr) == 1:
            ret[child.tag] = arr[0]
        else:
            ret[child.tag] = arr
    return ret
if len(sys.argv) > 1:
    pspec = dictify(sys.argv[1])
else:
    pspec = dictify("pspec.xml")

def get_node(node,attr=None):
    node = node.split(".")
    if not attr:
        attr = pspec
    for n in node:
        if n in attr:
            attr = attr[n]
        else:
            return None
    return attr

tab = 0
def print(line,n=0,nl="\n"):
    global tab
    sys.stdout.write("{}{}{}".format((tab*4*" "),line,nl))
    tab +=n
    
def o(tag,node,arr=False):
    if not get_node(node):
        return
    if type(node) == type([]):
        node = node[0]
    if arr:
        print("{} = {}".format(tag,str2arr(get_node(node))))
    else:
        print("{} = \"{}\"".format(tag,safe(get_node(node))))

def u(tag,var,arr=False):
    if arr:
        print("{} = {}".format(tag,str2arr(var)))
    else:
        print("{} = \"{}\"".format(tag,safe(var)))


def str2arr(msg):
    if type(msg) == type(""):
        return "[\'{}\']".format(msg)
    return str(msg)

def safe(msg):
    return str(msg).replace("\"","\\\"")

print("class inary:",1)
# Source section
print("class source:",1)
u("name",pspec["Source"]["Name"][0])
o("homepage","Source.Homepage")
print("class packager:",1)
o("name","Source.Packager.Name")
o("email","Source.Packager.Email")
tab-=1
o("license","Source.License",True)
o("isa","Source.IsA",True)
o("partof","Source.PartOf")
o("summary","Source.Summary")
o("description","Source.Description")
print("archive = [",1)
archive = get_node("Source.Archive")
if type(archive) == type({}):
    print("(\"{}\",\"{}\"),".format(archive["sha1sum"],archive["Archive"]))
else:
    for a in archive:
        print("(\"{}\",\"{}\"),".format(a["sha1sum"],a["Archive"]))
tab-=1
print("]")
o("builddependencies","Source.BuildDependencies.Dependency",True)
addfiles = get_node("Source.AdditionalFiles.AdditionalFile")
if addfiles:
    print("additionalfiles = [",1)
    if type(addfiles) == type({}):
        print("(\"{}\",\"{}\"),".format(addfiles["AdditionalFile"],addfiles["target"]))
    else:
        for a in addfiles:
            print("(\"{}\",\"{}\"),".format(a["AdditionalFile"],a["target"]))
    tab-=1
    print("]")
o("patches","Source.Patches.Patch",True)
# Package section
def opkg(node):
    global tab
    print("class pkg_{}:".format(node["Name"].replace("-","_")),1)
    u("name",node["Name"])
    if "RuntimeDependencies" in node:
        print("runtimedependencies = {}".format(node["RuntimeDependencies"]["Dependency"]))
    else:
        print("runtimedependencies = []")
    a = None
    if "Files" in node:
        a = node["Files"]["Path"]
    if a:
        print("files = [",1)
        if type(a) == type({}):
            print("(\"{}\",\"{}\"),".format(a["fileType"],a["Path"]))
        else:
            for aa in a:
                print("(\"{}\",\"{}\"),".format(aa["fileType"],aa["Path"]))
        tab-=1
        print("]")
    a = None
    if "AdditionalFiles" in node:
        a = node["AdditionalFiles"]["AdditionalFile"]
    if a:
        print("additionalfiles = [",1)
        if type(a) == type({}):
            print("(\"{}\",\"{}\",\"{}\",\"{}\"),".format(a["AdditionalFile"],a["owner"],a["permission"],a["target"]))
        else:
            for aa in a:
                print("(\"{}\",\"{}\",\"{}\",\"{}\"),".format(aa["AdditionalFile"],aa["owner"],aa["permission"],aa["target"]))
        tab-=1
        print("]")

if "Name" in get_node("Package"):
    print("packages = pkg_{}".format(str2arr(get_node("Package")["Name"].replace("-","_"))))
    tab=1
    opkg(get_node("Package"))
else:
    pkgs = []
    for i in get_node("Package"):
        pkgs.append("pkg_{}".format(i["Name"].replace("-","_")))
    print("packages = {}".format(pkgs))
    for i in get_node("Package"):
        tab=1
        opkg(i)
# history section
tab=1
print("class history:",1)
a = get_node("History.Update")
print("update = [",1)
if "Date" in a:
    print("(\"{}\",\"{}\",\"{}\",\"{}\",\"{}\")".format(a["Date"],a["Version"],safe(a["Comment"]),a["Name"],a["Email"]))
else:
    for aa in a:
        print("[\"{}\",\"{}\",\"{}\",\"{}\",\"{}\"],".format(aa["Date"],aa["Version"],safe(aa["Comment"]),aa["Name"],aa["Email"]))
tab-=1
print("]")

